// BIMFACE 模型文件管理-FileItems相关接口
// https://bimface.com/docs/file-management/v1/api-reference/uploadFileItemUsingPOST.html

import  bimfaceHttp from '@/api/Bimface';
import { FileItemModel } from './model/projectModel';
import {
  DownloadSourceFileModel,
  FileItemPathModel,
  FileItemsStatusModel,
  RemoveFileItmesModel,
  UploadNormalFileStreamParams,
  FileItemsPolicyParams,
  PolicyModel,
} from './model/fileItemModel';

enum Api {
  Folders = '/bdfs/data/v1/projects',
}

/**
 * @todo 待测试
 * @abstract: 普通文件流上传
 * @description: 使用普通文件流上传，文件流需要在request body中传递。
 */
export function uploadNormalFileStream(
  projectId: string,
  params: UploadNormalFileStreamParams,
  file: File,
  onUploadProgress?: (progressEvent) => void,
) {
  return bimfaceHttp.post<FileItemModel>({
    url: Api.Folders + `/${projectId}/fileItems`,
    params: params,
    data: file,
    timeout: 1000 * 60 * 10,
    onUploadProgress: onUploadProgress,
  });
}

/**
 * @todo 待实现
 * @abstract: 指定外部文件url方式上传
 * @description: 如果需要上传的文件不在本地，且该文件可以通过指定的HTTP URL可以下载，BIMFACE支持直接传一个外部的HTTP文件URL，BIMFACE会去下载该文件，而无须用户先下载再上传。
 */
export function uploadExternalURLFile() {
  return null;
}

/**
 * @todo 待实现
 * @abstract: 创建追加文件
 * @description: 当文件比较大或者所在网络网速较慢的情况下，单个文件上传的时间会比较长。如果中间有任何的网络错误， 本次上传就会被中断，文件重新上传将浪费大量时间。BIMFACE提供了断点上传的接口，即使上传过程中出现错误， 下一次也可以从上次错误的文件位置开始继续上传。进行断点续传前，先申请创建一个追加文件，并记录该追加文件ID。
 */
export function createAppendFile() {
  return null;
}

/**
 * @todo 待实现
 * @abstract: 追加上传文件
 * @description: 根据创建的追加文件信息进行追加上传。
 */
export function uploadAppendFile() {
  return null;
}

/**
 * @todo 待实现
 * @abstract: 创建分片上传任务
 * @description: BIMFACE提供分片上传功能，可以将待上传的文件切分为多个碎片（Part）分别上传，完成上传后再调用合并分片生成文件 (opens new window)接口，将碎片合并为完整的文件。
 */
export function createMultipartUploadTask() {
  return null;
}

/**
 * @todo 待实现
 * @abstract: 获取分片上传url
 * @description: 初始化一个分片上传任务后，调用本接口指定分片顺序，并通过获取的URL上传分片（Part）数据。 如果使用同一个partNumber上传了新的数据，则partNumber对应的Part数据将被覆盖。
 */
export function getMuitipartUploadURL() {
  return null;
}

/**
 * @todo 待实现
 * @abstract: 合并分片生成文件
 * @description: 在将所有数据Part都上传完成后，调用本接口来合并所有碎片，完成整个文件的分片上传。
 */
export function mergeMultipartFile() {
  return null;
}

/**
 * @todo 待实现
 * @abstract: 终止分片上传任务
 * @description: 使用本接口取消分片上传任务，并且删除已上传的Part数据。
 */
export function cancelMultipartUploadTask() {
  return null;
}

/**
 * @todo 待实现
 * @abstract: 复制文件
 * @description: 可以将文件项复制到指定的位置，此时复制的是该文件项的当前版本。支持通过指定文件项ID或文件项所在路径两种方式复制、支持跨项目复制。
 */
export function copyFile() {
  return null;
}

/**
 * @todo 待实现
 * @abstract: 获取文件直传的policy凭证
 * @description: BIMFACE使用了分布式对象存储来存储用户上传的模型、图纸文件。通过文件直传接口，开发者在申请到一个Policy凭证后可以直接上传文件到BIMFACE后台的分布式存储系统。相比普通文件流上传，这样上传速度和稳定性都会有提升，因此推荐开发者采用这种上传方式。
 */
export function getFileItemsPolicy(projectId: string, params: FileItemsPolicyParams) {
  return bimfaceHttp.get<PolicyModel>({
    url: Api.Folders + `/${projectId}/fileItems/policy`,
    params,
  });
}

/**
 * @todo 待实现
 * @abstract: 根据policy凭证在web端上传文件
 * @description: 通过接口获取文件直传的policy凭证 (opens new window)或获取新版本直传的policy凭证 (opens new window)后，可以直接在前端使用表单上传方式将文件上传到BIMFACE的对象存储上。BIMFACE 控制台就是通过这种方式来实现文件上传的，可以F12→network查看请求详情。
 */
export async function uploadFileByPolicy(
  projectId,
  params,
  file,
  onUploadProgress?: (progressEvent) => void,
) {
  const res = await getFileItemsPolicy(projectId, params);
  const url = res.data.host;
  const data = {
    name: params.name,
    key: res.data.objectKey,
    policy: res.data.policy,
    OSSAccessKeyId: res.data.accessId,
    callback: res.data.callbackBody,
    signature: res.data.signature,
    success_action_status: 200,
  };
  return bimfaceHttp.uploadFile({ url, timeout: 3 * 60 * 1000, onUploadProgress }, { data, file });
}

/**
 * @todo 待实现
 * @abstract: 获取追加文件信息
 * @description: 根据appendFileId查询追加文件信息。
 */
export function getAppendFileInfo() {
  return null;
}

/**
 * @abstract: 获取文件信息
 * @description: 根据文件项ID或文件项所在路径获取文件的详细信息，此时获取的是该文件项的当前版本的信息。
 */
export function getFileInfo(
  projectId: string,
  params: {
    fileItemId?: string;
    path?: string;
    withItemSource?: boolean;
  },
) {
  return bimfaceHttp.get<FileItemModel>({
    url: Api.Folders + `/${projectId}/fileItems/meta`,
    params: params,
  });
}

/**
 * @abstract: 获取所有版本文件信息
 * @description: 根据文件项ID或文件项所在路径获取该文件项下所有版本文件的信息。
 */
export function getFileVersionsInfo(
  projectId: string,
  params: {
    fileItemId?: string;
    path?: string;
    pageNo?: number;
    pageSize?: number;
  },
) {
  return bimfaceHttp.get<FileItemModel>({
    url: Api.Folders + `/${projectId}/fileItems/files`,
    params: params,
  });
}

/**
 * @abstract: 获取文件状态
 * @description: 根据文件项ID或文件项所在路径获取文件上传状态信息，此时获取的是该文件项的当前版本的信息。
 */
export function getFileStatus(
  projectId: string,
  params: {
    fileItemId?: string;
    path?: string;
  },
) {
  return bimfaceHttp.get<FileItemsStatusModel>({
    url: Api.Folders + `/${projectId}/fileItems/status`,
    params: params,
  });
}

/**
 * @abstract: 源文件下载
 * @description: 通过该接口可获取文件项的当前版本的下载地址，下载地址有效时间为60分钟，可通过参数修改有效期。
 */
export function downloadSourceFile(
  projectId: string,
  params: {
    fileItemId?: string;
    path?: string;
    expireTime?: string;
  },
) {
  return bimfaceHttp.get<DownloadSourceFileModel>({
    url: Api.Folders + `/${projectId}/fileItems/downloadUrl`,
    params: params,
  });
}

/**
 * @abstract: 获取文件路径
 * @description: 通过接口，可根据文件项ID获得文件项所在的路径。
 */
export function getFilePath(projectId: string, fileItemsId: string) {
  return bimfaceHttp.get<FileItemPathModel>({
    url: Api.Folders + `/${projectId}/fileItems/${fileItemsId}/fileItemPath`,
  });
}

/**
 * @abstract: 打包下载压缩文件
 * @description: 支持打包下载多个文件，此时下载的是各个文件项的当前版本。
 */
export function downloadCompressedFile(
  projectId: string,
  params: {
    fileItemIds: string;
  },
) {
  return bimfaceHttp.get({
    url: Api.Folders + `/${projectId}/fileItems/downloadZip`,
    params: params,
    timeout: 3 * 60 * 1000,
    responseType: 'blob',
  });
}

/**
 * @abstract: 移动文件位置
 * @description: 移动文件项（包括文件项下所有版本）所在的位置，可以通过文件项ID或文件项所在路径参数指定新的位置，支持批量移动，无法跨项目移动。
 */
export function moveFileItem(
  projectId: string,
  data: {
    fileItemIds?: string[];
    fileItemPaths?: string[];
    targetParentId?: string;
    targetParentPath?: string;
  },
) {
  return bimfaceHttp.patch<DownloadSourceFileModel>({
    url: Api.Folders + `/${projectId}/fileItems/moveItem`,
    data: data,
  });
}

/**
 * @abstract: 文件重命名
 * @description: 通过接口对文件项的名称进行修改，可通过文件项ID和文件项所在路径两种参数指定需要修改的文件项。
 */
export function renameFileItem(
  projectId: string,
  data: {
    path?: string;
    fileItemId?: string;
    fileItemName?: string;
  },
) {
  return bimfaceHttp.patch<FileItemModel>({
    url: Api.Folders + `/${projectId}/fileItems`,
    data: data,
  });
}

/**
 * @abstract: 批量删除文件
 * @description: 通过接口传入多个文件项ID，即可批量删除文件项（包括文件项下所有版本）。
 */
export function removeFileItems(
  projectId: string,
  data: {
    fileItemIds: string[];
  },
) {
  return bimfaceHttp.delete<RemoveFileItmesModel>({
    url: Api.Folders + `/${projectId}/fileItems`,
    data: data.fileItemIds,
  });
}
